/**
 * 给定一个可能包含重复元素的整数数组nums, 返回该数组所有可能得子集
 * 说明: 解集中不能包含重复的子集
 * 示例:
 * 输入: [1, 2, 2]
 * 输出: [
 *  [2],
 *  [1],
 *  [1, 2, 2],
 *  [2, 2],
 *  [1, 2],
 *  [],
 * ]
*/
function subsets2 (nums) {
    // 排序
    nums.sort((a, b) => a - b);
    // 找出所有子集
    const result = [];
    result.push([]);
    const map = {};
    for (let i = 0; i < nums.length; i++) {
        const temp = [];
        for (let j = 0; j < result.length; j++) {
            const r = [...result[j]];
            r.push(nums[i]);
            temp.push(r);
        }
        for (let k = 0; k < temp.length; k++) {
            // 建立hash表判断有无重复元素
            if (!map[temp[k].join("")]) {
                map[temp[k].join("")] = true;
                result.push(temp[k]);
            }
        }
    }
    return result;
}

console.log(subsets2([2, 1, 2]));